From: Claudio Cambra Date: Wed, 26 Mar 2025 12:31:00 +0000 (+0100) Subject: gui/macOS: Correctly release objects received via FileProviderUtils functions X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2^2~62^2~7 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=6eca65b888d8c1a4f583cc5d7ac876cb7ffca6dc;p=nextcloud-desktop.git gui/macOS: Correctly release objects received via FileProviderUtils functions Signed-off-by: Claudio Cambra --- diff --git a/src/gui/macOS/fileprovideritemmetadata_mac.mm b/src/gui/macOS/fileprovideritemmetadata_mac.mm index ec9667470..8ff39979f 100644 --- a/src/gui/macOS/fileprovideritemmetadata_mac.mm +++ b/src/gui/macOS/fileprovideritemmetadata_mac.mm @@ -147,6 +147,8 @@ QString FileProviderItemMetadata::getUserVisiblePath() const dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); + [manager release]; + return returnPath; } diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm index b2fe54011..cfa73a14a 100644 --- a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm @@ -59,6 +59,8 @@ void FileProviderMaterialisedItemsModel::evictItem(const QString &identifier, co }]; dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC)); + [manager release]; + if (successfullyDeleted == NO) { return; } diff --git a/src/gui/macOS/fileprovidersettingscontroller_mac.mm b/src/gui/macOS/fileprovidersettingscontroller_mac.mm index d1fd68e69..89e1b76e2 100644 --- a/src/gui/macOS/fileprovidersettingscontroller_mac.mm +++ b/src/gui/macOS/fileprovidersettingscontroller_mac.mm @@ -167,6 +167,7 @@ public: qCInfo(lcFileProviderSettingsController) << "Signalling file provider domain" << userIdAtHost; NSFileProviderDomain * const domain = FileProviderUtils::domainForIdentifier(userIdAtHost); NSFileProviderManager * const manager = [NSFileProviderManager managerForDomain:domain]; + [domain release]; [manager signalEnumeratorForContainerItemIdentifier:NSFileProviderRootContainerItemIdentifier completionHandler:^(NSError *const error) { if (error != nil) { @@ -186,6 +187,7 @@ public: } public slots: + // NOTE: This method will release the provided args so make sure to retain them beforehand void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const managerForDomain, NSFileProviderDomain * const domain) { @@ -228,6 +230,9 @@ public slots: [storageUseObserver release]; [enumerator release]; + + [managerForDomain release]; + [domain release]; }; [enumerator enumerateItemsForObserver:storageUseObserver startingAtPage:NSFileProviderInitialPageSortedByName]; } @@ -283,7 +288,8 @@ private: << ", returning early."; return; } - + [managerForDomain retain]; + [domain retain]; enumerateMaterialisedFilesForDomainManager(managerForDomain, domain); } }]; diff --git a/src/gui/macOS/fileproviderutils.h b/src/gui/macOS/fileproviderutils.h index 063be6d6d..8a710fccf 100644 --- a/src/gui/macOS/fileproviderutils.h +++ b/src/gui/macOS/fileproviderutils.h @@ -29,6 +29,10 @@ class QString; * * You should threfore try to avoid using this in C++ code wherever possible * and only use this in *_mac.mm implementation files. + * + * IMPORTANT: All Objective-C objects returned here need to be released! + * They have been internally retained due to the async nature of the + * FileProvider API. */ namespace OCC {